package com.roads.project.mapper;

import com.roads.project.domain.ProInstitution;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 机构Mapper接口
 * 
 * @author nhp
 * @date 2021-11-16
 */
public interface ProInstitutionMapper {

    /**
     * 查询机构
     * 
     * @param institutionId 机构主键
     * @return 机构
     */
    ProInstitution selectProInstitutionByInstitutionId(Integer institutionId);

    /**
     * 根据编码查询信息
     *
     * @param code 机构编码
     * @return
     */
    ProInstitution getModelByInnerCode(String code);

    /**
     * 查询机构列表
     * 
     * @param proInstitution 机构
     * @return 机构集合
     */
    List<ProInstitution> selectProInstitutionList(ProInstitution proInstitution);

    /**
     * 查询全部机构列表
     *
     * @param proInstitution 机构
     * @return 机构集合
     */
    List<ProInstitution> selectProInstitutionListAll(ProInstitution proInstitution);

    /**
     * 查询标段列表--标段和分包类型 关联项目信息
     *
     * @param proInstitution 机构
     * @return 机构集合
     */
    List<ProInstitution> selectProjectBidBranch(ProInstitution proInstitution);

    /**
     * 查询标段列表--所有机构标段 关联项目信息
     *
     * @param proInstitution 机构
     * @return 机构集合
     */
    List<ProInstitution> selectProjectBid(ProInstitution proInstitution);

    /**
     * 查询监理标段列表--驻地，监理，总监类型 关联项目信息
     *
     * @param proInstitution 机构
     * @return 机构集合
     */
    List<ProInstitution> selectProjectSupervisorBid(ProInstitution proInstitution);

    /**
     * 查询标段列表--标段和分包类型
     *
     * @param proInstitution 机构
     * @return 结构结合
     */
    List<ProInstitution> selectBidBranch(ProInstitution proInstitution);

    /**
     * 根据项目ID获取所有结构
     *
     * @param search 查询条件
     * @return 机构集合
     */
    List<ProInstitution> selectBidByProjectId(ProInstitution search);

    /**
     * 根据项目ID获取所有标段和分部
     *
     * @param projectId 项目ID
     * @return 标段分部集合
     */
    List<ProInstitution> selectBidAndBranchByProjectId(Integer projectId);

    /**
     * 监理普通下拉框--主要用于监理计量新增
     *
     * @param proInstitution 机构
     * @return 机构集合
     */
    List<ProInstitution> selectSupervisorBid(ProInstitution proInstitution);

    /**
     * 代建普通下拉框--主要用于代建计量新增
     *
     * @param proInstitution 机构
     * @return 机构集合
     */
    List<ProInstitution> selectAgencyBid(ProInstitution proInstitution);

    /**
     * 监理普通下拉框--主要用于监理汇总
     *
     * @param proInstitution 机构
     * @return 机构集合
     */
    List<ProInstitution> selectSummarySupervisorBid(ProInstitution proInstitution);

    /**
     * 代建普通下拉框--主要用于代建汇总
     *
     * @param proInstitution 机构
     * @return 机构集合
     */
    List<ProInstitution> selectSummaryAgencyBid(ProInstitution proInstitution);

    /**
     * 查看项目下所有标段类型机构
     *
     * @param projectId 项目ID
     * @return 标段机构集合
     */
    List<ProInstitution> dropDownBidByProjectId(Integer projectId);

    /**
     * 查询项目下所有驻地类型机构
     *
     * @param projectId 项目ID
     * @return 驻地机构集合
     */
    List<ProInstitution> dropDownZdBidByProjectId(Integer projectId);

    /**
     * 查询项目下所有监理类型机构
     *
     * @param projectId 项目ID
     * @return 监理机构集合
     */
    List<ProInstitution> dropDownJlBidByProjectId(Integer projectId);

    /**
     * 查询项目下所有总监类型机构
     *
     * @param projectId 项目ID
     * @return 总监机构集合
     */
    List<ProInstitution> dropDownZjBidByProjectId(Integer projectId);

    /**
     * 查询项目下所有代建类型机构
     *
     * @param projectId 项目ID
     * @return 代建机构集合
     */
    List<ProInstitution> dropDownDjBidByProjectId(Integer projectId);

    /**
     * 查询项目下所有业主类型机构
     *
     * @param projectId 项目ID
     * @return 业主机构集合
     */
    List<ProInstitution> dropDownYzBidByProjectId(Integer projectId);

    /**
     * 根据项目ID查询所有标段和分部机构
     *
     * @param projectId 项目ID
     * @return 结果
     */
    List<ProInstitution> selectBidListByProjectId(@Param("projectId") Integer projectId);

    /**
     * 根据用户查询项目下所有标段和分部机构
     *
     * @param projectId 项目ID
     * @param user 用户
     * @return 结果
     */
    List<ProInstitution> selectBidListByUserAndProjectId(@Param("projectId") Integer projectId,@Param("user") String user);

    /**
     * 校验机构编码是否唯一
     *
     * @param institutionCode 机构编码
     * @return 结果
     */
    ProInstitution checkInstitutionCodeUnique(String institutionCode);

    /**
     * 根据内码查询机构用户
     *
     * @param innerCode 内码
     * @return 数量
     */
    int countUserByInnerCode(String innerCode);

    /**
     * 查询项目下机构数量
     *
     * @param projectId 项目ID
     * @return 数量
     */
    int countByProjectId(Integer projectId);

    /**
     * 新增机构
     * 
     * @param proInstitution 机构
     * @return 结果
     */
    int insertProInstitution(ProInstitution proInstitution);

    /**
     * 修改机构
     * 
     * @param proInstitution 机构
     * @return 结果
     */
    int updateProInstitution(ProInstitution proInstitution);

    /**
     * 删除机构
     * 
     * @param institutionId 机构主键
     * @return 结果
     */
    int deleteProInstitutionByInstitutionId(Integer institutionId);

    /**
     * 批量删除机构
     * 
     * @param institutionIds 需要删除的数据主键集合
     * @return 结果
     */
    int deleteProInstitutionByInstitutionIds(Integer[] institutionIds);

    /**
     * 新增监理清单模板
     * 这里为了不过分引用其他工程，在project工程下直接新增
     *
     * @param institutionCode 机构编号
     * @param user 当前登录用户
     * @return 结果
     */
    int insertSupervisorBoqTemplate(@Param("institutionCode")String institutionCode, @Param("user")String user);

    /**
     * 新增代建清单模板
     * 这里为了不过分引用其他工程，在project工程下直接新增
     *
     * @param institutionCode 机构编号
     * @param user 当前登录用户
     * @return 结果
     */
    int insertAgencyBoqTemplate(@Param("institutionCode")String institutionCode, @Param("user")String user);

    /**
     * 查看施工标段是否计量
     *
     * @param institutionCode 标段编号
     * @return 数量，如果>0则已计量
     */
    int hasMeterageConstruction(String institutionCode);

    /**
     * 查看施工标段是否有变更令
     *
     * @param institutionCode 标段编号
     * @return 数量，如果>0则有变更
     */
    int hasChangeOrder(String institutionCode);

    /**
     * 查看监理标段是否计量
     *
     * @param institutionCode 标段编号
     * @return 数量，如果>0则已计量
     */
    int hasMeterageSupervisor(String institutionCode);

    /**
     * 查看代建标段是否计量
     *
     * @param institutionCode 标段编号
     * @return 数量，如果>0则已计量
     */
    int hasMeterageAgency(String institutionCode);

    /**
     * 删除施工标段
     * 删除清单、工期、计量清单、汇总相关多个表
     *
     * @param institutionCode 标段编号
     */
    void deleteConstruction(String institutionCode);

    /**
     * 删除监理标段
     * 删除清单、工期、清单模板、汇总相关多个表
     *
     * @param institutionCode 标段编号
     */
    void deleteSupervisor(String institutionCode);

    /**
     * 删除代建标段
     * 删除清单、工期、清单模板、汇总相关多个表
     *
     * @param institutionCode 标段编号
     */
    void deleteAgency(String institutionCode);

}
